package main

import (
	"fmt"
)

//类型断言：将一个接口变量，赋值给自定义类型的变量
//语法：其他类型变量 = 接口类型变量.(其他类型type)

// 判断输入的参数类型
func TypeJudge(items... interface{}){
	for index, val := range items{
		switch val.(type) {
		case float64:
			fmt.Printf("第%v个参数是float64 类型，值是%v\n", index+1, val)
		case float32:
			fmt.Printf("第%v个参数是float32 类型，值是%v\n", index+1, val)
		case bool:
			fmt.Printf("第%v个参数是bool 类型，值是%v\n", index+1, val)
		case int, int8, int32, int64:
			fmt.Printf("第%v个参数是 整型 类型，值是%v\n", index+1, val)
		case string:
			fmt.Printf("第%v个参数是string 类型，值是%v\n", index+1, val)
		default:
			fmt.Printf("第%v个参数是类型不确定，值是%v\n", index+1, val)
		}
	}
}



func main() {
	var i interface{}
	var a int = 1
	i = a
	// a = i 不可行，此时需类型断言
	a = i.(int)  // 只能是int
	fmt.Println(i, a)

	// 如果在类型断言时，类型不匹配，则会panic，程序终止
	// 为避免这种情况，在断言时，带上检测机制进行检测
	var i2 interface{}
	var b  = 2.3
	i2 = b
	//c, flag := i2.(float64)
	c, flag := i2.(float32)
	//if c, flag := i2.(float32); flag{
	if flag{
		fmt.Println("断言检测正确")
		fmt.Println(c)
	}else {
		fmt.Println("断言检测失败")
	}
	fmt.Println("此代码可继续执行")

	var v1 float64 = 6.4
	var v2 float32 = 3.2
	var v3 int8 = 8
	var name = "go"
	v4 := 100
	v5 := true
	TypeJudge(v1, v2, v3, v4, name, v5)
}
